#include <reg51.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char

sbit SN_GREEN = P2 ^ 0;  // 南北绿灯
sbit SN_YELLOW = P2 ^ 1; // 南北黄灯
sbit SN_RED = P2 ^ 2;    // 南北红灯
sbit EW_GREEN = P2 ^ 3;  // 东西绿灯
sbit EW_YELLOW = P2 ^ 4; // 东西黄灯
sbit EW_RED = P2 ^ 5;    // 东西红灯

void delay_ms(uint ms) {
    uint i, j;
    for(i = 0; i < ms; i++)
        for(j = 0; j < 123; j++);
}

void all_lights_off() {
    SN_GREEN = 0;
    SN_YELLOW = 0;
    SN_RED = 0;
    EW_GREEN = 0;
    EW_YELLOW = 0;
    EW_RED = 0;
}

void main() {
    uchar i;
    
    while(1) {
        // 阶段1：南北绿灯，东西红灯，其余灯均灭
        all_lights_off();
        SN_GREEN = 1;  // 南北绿灯亮
        EW_RED = 1;    // 东西红灯亮
        delay_ms(5000);
        
        // 阶段2：南北黄灯闪烁3次，东西红灯保持，其余灯均灭
        all_lights_off();
        EW_RED = 1;    // 保持东西红灯
        for(i = 0; i < 3; i++) {
            SN_YELLOW = 1;  // 南北黄灯亮
            delay_ms(500);
            SN_YELLOW = 0;  // 南北黄灯灭
            delay_ms(500);
        }
        
        // 阶段3：东西绿灯，南北红灯，其余灯均灭
        all_lights_off();
        EW_GREEN = 1;  // 东西绿灯亮
        SN_RED = 1;     // 南北红灯亮
        delay_ms(5000);
        
        // 阶段4：东西黄灯闪烁3次，南北红灯保持，其余灯均灭
        all_lights_off();
        SN_RED = 1;     // 保持南北红灯
        for(i = 0; i < 3; i++) {
            EW_YELLOW = 1;  // 东西黄灯亮
            delay_ms(500);
            EW_YELLOW = 0;  // 东西黄灯灭
            delay_ms(500);
        }
        
        // 循环回到阶段1
    }
}